package algo3.grupo3.vista;

import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.ImageIcon;

import algo3.grupo3.controlador.LogicaJuego;
import algo3.grupo3.modelo.*;

public abstract class Entidad {
	protected ObjetoAnimado objeto;
	private int[] posicion= {-1,-1};
	private Image apariencia = null;
	private int ancho = 50,alto = 50;
	/*ancho y alto son las dimensiones de la apariencia de objeto. anchoEspacio y altoEspacio son
	 * los espacios en ancho y alto respectivamente  */
	private static int anchoEscalaPosicion = 50, altoEscalaPosicion = 50;
	/*la escala o cuadro de posicion debe ser igual para todas las entidades!!! */
	protected static LogicaJuego logicaJuego= null;
	/*todas las entidades deben referirse a una misma VentanaJuego */
	
	
	public Entidad(int ancho, int alto, ObjetoAnimado oa){
		this.inicializarEntidad(ancho, alto);
		this.objeto = oa;
	}//fin de constructor
	
	private void inicializarEntidad(int ancho,int alto){
		this.cambiarAlto(alto);
		this.cambiarAncho(ancho);
	}//fin de inicializarEntidad
	
	
	public synchronized void actualizar(double tiempo){
		if(objeto == null)
			return;
		this.objeto.actualizarEstado(tiempo);
		if(!this.objeto.sigueActivo()){
			//this.terminar();
			return;
		}
		if(posicion== null)
			return;
		this.posicion[0]= anchoEscalaPosicion*objeto.obtenerCoordenadas()[0] + anchoEscalaPosicion;
		this.posicion[1]= altoEscalaPosicion*objeto.obtenerCoordenadas()[1] + anchoEscalaPosicion;
		
	}//fin de actualizar
	
	public synchronized void dibujar(Graphics2D graficos){
		if(objeto== null)
			return;
		if(objeto.obtenerCoordenadas() == null || !objeto.sigueActivo() || graficos == null)
			return;
		
		graficos.drawImage(apariencia, posicion[0], posicion[1], ancho, alto, null);
		
	}//fin de dibujar
	
	protected void cambiarApariencia(String pathImagen){
		this.apariencia= (new ImageIcon(pathImagen)).getImage();
	}//fin de cambiarApariencia
	
	public Image obtenerApariencia(){
		return this.apariencia;
	}//fin de obtenerApariencia
	
	public synchronized ObjetoAnimado obtenerObjeto(){
		return this.objeto;
	}//fin de obtenerObjeto
	
	public void cambiarAlto(int a){
		if(a>0)
			this.alto= a;
	}//fin de cambiarAlto
	
	public void cambiarAncho(int a){
		if(a>0)
			this.ancho= a;
	}//fin de cambiarAncho
	
	public static void cambiarAnchoEscalaPosicion(int ae){
		if(ae<=0)
			return;
		anchoEscalaPosicion= ae;
	}//cambiarAnchoEscalaPosicion
	

	public static void cambiarAltoEscalaPosicion(int ae){
		if(ae<=0)
			return;
		altoEscalaPosicion= ae;
	}//fin de cambiarAltoEscalaPosicion
	
	public static int obtenerAnchoEscalaPosicion(){
		return anchoEscalaPosicion;
	}//fin de obtenerAnchoEscalaPosicion
	
	public static int obtenerAltoEscalaPosicion(){
		return altoEscalaPosicion;
	}//fin de obtenerAltoEscalaPosicion
	
	public int obtenerAncho(){
		return this.ancho;
	}//fin de obtenerAlto
	
	public int obtenerAlto(){
		return this.alto;
	}//fin de obtenerAlto
	
	public synchronized boolean objetoSigueActivo(){
		if(objeto == null)
			return false;
		return this.objeto.sigueActivo();
	}
	
	private void terminar(){
		
		this.objeto= null;
		this.apariencia= null;
		this.posicion= null;
		System.gc();
		
	}//fin de terminar
	
	public static void establecerLogicaJuego(LogicaJuego lj){
		if(lj== null)
			return;
		logicaJuego= lj;
	}//fin de establecerLogicaJuego
	
	public LogicaJuego obtenerLogicaJuego(){
		return logicaJuego;
	}//fin de obtenerLogicaJuego
	
	protected abstract void establecerApariencia();
	
	public int[] obtenerPosicion(){
		return this.posicion;
	}//fin de obtenerPosicion
	
}//fin de Entidad
/*falta terminar el disenio de esta clase.
 * PREGUNTA: agregamos varias clases que extiendan a Entidad como EntidadBomba o EntidadBombita? */
 